// 第一题
// 找出数组中落单的数字
// [11, 2, 33, 44, 33, 44, 11] ===> 2


let arr = [11, 2, 33, 44, 33, 44, 11];
// 第一种
// 遍历查找
function getOneNum(arr) {
    let resObj = {};
    let reValue = null;
    for (const value of arr) {
        if (value in resObj) {
            resObj[value]++;
        } else {
            resObj[value] = 1;
        }
    }
    for (const key in resObj) {
        if (Object.hasOwnProperty.call(resObj, key)) {
            const value = resObj[key];
            if (+value === 1) {
                reValue = key
            }
        }
    }
    return reValue
}
let res1 = getOneNum(arr);
console.log('res1:', res1);



// 第二种
// indexof和lastIndexof
let arr2 = [11, 2, 33, 44, 33, 44, 11];
function getOneNum2(arr) {
    return arr.filter(item => arr.indexOf(item) === arr.lastIndexOf(item)).pop();
};
console.log('res2:', getOneNum2(arr2));




// 第三种
// 异或运算
// 两个相同的数字进行异或运算得0
// 如果0与任何值不为0的数字进行异或运算得到本身
// 局限：只能处理两两成对的情况
let arr3 = [11, 2, 33, 44, 33, 44, 11];
function getOneNum3(arr) {
    let res = 0;
    arr3.forEach((item, index) => {
        res ^= item;
    })
    return res;
}
console.log('rse3:', getOneNum3(arr3))



